﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;

namespace TestRESTServices
{

    [TestClass]
    public class TestEmpleados
    {


        [TestMethod]
        public void TestMethod1()
        {
            //// Prueba de creación de empleado vía HTTP POST

            //Transformar el objeto empleado a formato JSON
            //Crear el objeto empleado
            Empleado empleadoACrear = new Empleado()
            {
                Codigo = 2,
                DNI = 12345678,
                Nombre = "Robin",
                Apellido = "Neyra",
                FechaNacimiento = "24/10/1979",
                Telefono = "522-2317",
                Estado = 1,
                Usuario = "rneyra",
                Clave = "123456"
            };
            //Realizar la conversion
            JavaScriptSerializer serializar = new JavaScriptSerializer();
            string postdata = serializar.Serialize(empleadoACrear);
            byte[] data = Encoding.UTF8.GetBytes(postdata);

            ////string postdata = "{\"Codigo\":13,\"DNI\":88152222,\"Nombre\":\"Juan\",\"Apellido\":\"Heredia\",\"FechaNacimiento\":\"24/10/1970\",\"Telefono\":\"5222324\",\"Estado\":1}"; //JSON
            ////byte[] data = Encoding.UTF8.GetBytes(postdata);

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:17279/Empleados.svc/Empleados");
            req.Method = "POST";
            req.ContentLength = data.Length;
            req.ContentType = "application/json";

            var reqStream = req.GetRequestStream();
            reqStream.Write(data, 0, data.Length);

            //var res = (HttpWebResponse)req.GetResponse();
            HttpWebResponse res = null;
            Empleado empleadoNuevo = null;
            try
            {
                res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());
                string empleadoJson = reader.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                empleadoNuevo = js.Deserialize<Empleado>(empleadoJson);
            }
            catch (WebException e)
            {
                HttpWebResponse resError = (HttpWebResponse)e.Response;
                StreamReader readerError = new StreamReader(resError.GetResponseStream());
                string errorJson = readerError.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                MensajeError errorNuevo = js.Deserialize<MensajeError>(errorJson);
                Assert.AreEqual("El empleado ya se encuentra registrado", errorNuevo.Mensaje);
            }

            Assert.AreEqual(2, empleadoNuevo.Codigo);
            Assert.AreEqual(12345678, empleadoNuevo.DNI);
            Assert.AreEqual("Robin", empleadoNuevo.Nombre);
            Assert.AreEqual("Neyra", empleadoNuevo.Apellido);
            Assert.AreEqual("24/10/1979", empleadoNuevo.FechaNacimiento);
            Assert.AreEqual("522-2317", empleadoNuevo.Telefono);
            Assert.AreEqual(1, empleadoNuevo.Estado);
            Assert.AreEqual("rneyra", empleadoNuevo.Usuario);
            Assert.AreEqual("123456", empleadoNuevo.Clave);


            // Prueba de obtención de empleado vía HTTP GET
            int codigo = 2;
            
            HttpWebRequest req2 = (HttpWebRequest)WebRequest.Create("http://localhost:17279/Empleados.svc/Empleados/" + codigo);
            req2.Method = "GET";
            HttpWebResponse res2 = (HttpWebResponse)req2.GetResponse();
            StreamReader reader2 = new StreamReader(res2.GetResponseStream());
            string empleadoJson2 = reader2.ReadToEnd();
            JavaScriptSerializer js2 = new JavaScriptSerializer();
            Empleado empleadoObtenido = js2.Deserialize<Empleado>(empleadoJson2);
            Assert.AreEqual(2, empleadoNuevo.Codigo);
            Assert.AreEqual(12345678, empleadoNuevo.DNI);
            Assert.AreEqual("Robin", empleadoNuevo.Nombre);
            Assert.AreEqual("Neyra", empleadoNuevo.Apellido);
            Assert.AreEqual("24/10/1979", empleadoNuevo.FechaNacimiento);
            Assert.AreEqual("522-2317", empleadoNuevo.Telefono);
            Assert.AreEqual(1, empleadoNuevo.Estado);
            Assert.AreEqual("rneyra", empleadoNuevo.Usuario);
            Assert.AreEqual("123456", empleadoNuevo.Clave);

            // Prueba de modificacion de empleado vía HTTP PUT
            Empleado empleadoAModificar = new Empleado()
            {
                Codigo = 2,
                DNI = 12345678,
                Nombre = "Robin",
                Apellido = "Neyra",
                FechaNacimiento = "24/10/1979",
                Telefono = "522-2333",
                Estado = 1
            };

            JavaScriptSerializer serializar3 = new JavaScriptSerializer();
            string postdata3 = serializar3.Serialize(empleadoAModificar);
            byte[] data3 = Encoding.UTF8.GetBytes(postdata3);

            //string postdata3 = "{\"Codigo\":6,\"DNI\":12345678,\"Nombre\":\"Juana\",\"Apellido\":\"Heredia\",\"FechaNacimiento\":\"24/10/1970\",\"Telefono\":\"5222324\",\"Estado\":1}"; //JSON
            //byte[] data3 = Encoding.UTF8.GetBytes(postdata3);

            HttpWebRequest req3 = (HttpWebRequest)WebRequest.Create("http://localhost:17279/Empleados.svc/Empleados");
            req3.Method = "PUT";
            req3.ContentLength = data3.Length;
            req3.ContentType = "application/json";

            var reqStream3 = req3.GetRequestStream();
            reqStream3.Write(data3, 0, data3.Length);

            HttpWebResponse res3 = (HttpWebResponse)req3.GetResponse();
            StreamReader reader3 = new StreamReader(res3.GetResponseStream());
            string empleadoJson3 = reader3.ReadToEnd();
            JavaScriptSerializer js3 = new JavaScriptSerializer();
            Empleado empleadoModificado = js3.Deserialize<Empleado>(empleadoJson3);

            Assert.AreEqual("522-2777", empleadoModificado.Telefono);


            // Prueba de creación de empleado vía HTTP DELETE
            string postdata4 = "\"2\""; //JSON
            byte[] data4 = Encoding.UTF8.GetBytes(postdata4);
            HttpWebRequest req4 = (HttpWebRequest)WebRequest.Create("http://localhost:17279/Empleados.svc/Empleados");
            req4.Method = "DELETE";
            req4.ContentLength = data4.Length;
            req4.ContentType = "application/json";
            var reqStream2 = req4.GetRequestStream();
            reqStream2.Write(data4, 0, data4.Length);
            var res4 = (HttpWebResponse)req4.GetResponse();

            //Prueba de listado de empleado vía HTTP GET
            HttpWebRequest req5 = (HttpWebRequest)WebRequest.Create("http://localhost:17279/Empleados.svc/Empleados");
            req5.Method = "GET";
            HttpWebResponse res5 = (HttpWebResponse)req5.GetResponse();
            StreamReader reader5 = new StreamReader(res5.GetResponseStream());
            string listaJson = reader5.ReadToEnd();
            JavaScriptSerializer js5 = new JavaScriptSerializer();
            List<Empleado> empleadoLista = js5.Deserialize<List<Empleado>>(listaJson);
            Assert.IsTrue(empleadoLista.Count > 0);


            string usuario = "mneyra";
            // Prueba de obtención de empleado vía HTTP GET
            HttpWebRequest req6 = (HttpWebRequest)WebRequest.Create("http://localhost:17279/Empleados.svc/Usuarios?usuario=" + usuario);
            req6.Method = "GET";
            HttpWebResponse res6 = (HttpWebResponse)req6.GetResponse();
            StreamReader reader6 = new StreamReader(res6.GetResponseStream());
            string empleadoJson6 = reader6.ReadToEnd();
            JavaScriptSerializer js6 = new JavaScriptSerializer();
            Empleado usuarioObtenido = js6.Deserialize<Empleado>(empleadoJson6);
            Assert.AreEqual(1, usuarioObtenido.Codigo);

            int dni = 11160813;
            // Prueba de obtención de empleado vía HTTP GET
            HttpWebRequest req7 = (HttpWebRequest)WebRequest.Create("http://localhost:17279/Empleados.svc/Empleados?dni="+ dni);
            req7.Method = "GET";
            HttpWebResponse res7 = (HttpWebResponse)req7.GetResponse();
            StreamReader reader7 = new StreamReader(res7.GetResponseStream());
            string empleadoJson7 = reader7.ReadToEnd();
            JavaScriptSerializer js7 = new JavaScriptSerializer();
            Empleado empleadoDNIObtenido = js7.Deserialize<Empleado>(empleadoJson7);
            Assert.AreEqual(11160813, empleadoDNIObtenido.DNI);

        }
    }
}
